#include <bits/stdc++.h>
// 2025/06/10
// tag:
// Author: Forever
using namespace std;
using int64 = int64_t;

const int N = 301;
int n, m, f[N][N], s[N];
vector<int> edge[N];

void dfs(int u)
{
    // 初始化：选择当前节点自身时的分数
    f[u][1] = s[u];

    // 遍历所有子节点（树形DP典型结构）
    for (int v : edge[u]) {
        dfs(v); // 递归处理子树

        // 背包DP核心部分（倒序更新防止重复计算）
        // i表示当前节点u的总选课数，从上限m递减
        for (int i = m; i >= 1; i--) {
            // j表示分配给子节点v的选课数（至少留1个给父节点）
            for (int j = 1; j < i; j++)
                // 状态转移：尝试将j个课程分配给子节点v，保留i-j个给当前节点
                f[u][i] = max(f[u][i], f[u][i - j] + f[v][j]);
        }
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int v;
        cin >> v >> s[i];
        edge[v].push_back(i);
    }
    m++;
    dfs(0);
    cout << f[0][m] << endl;
    return 0;
}